#ifndef MPHTTPRESPONSETRANSLATION_H
#define MPHTTPRESPONSETRANSLATION_H

/******************************
 * 名称：      HTTP响应翻译员
 * 用途：      负责解析Socket接收到的数据并填充至HttpResponseMessage中
 * 作用范围：   建议仅程序集内使用
 * 创建时间：   2022-10-03
 * 参   考：
 * https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Transfer-Encoding  [分块编码（Transfer-Encoding: chunked）]
 * https://www.cnblogs.com/xuehaoyue/p/6639029.html
 *
 * 分块编码返回示例：
 *
 * HTTP/1.1 200 OK
 * Content-Type: text/plain
 * Transfer-Encoding: chunked
 *
 * 7\r\n
 * Mozilla\r\n
 * 9\r\n
 * Developer\r\n
 * 7\r\n
 * Network\r\n
 * 0\r\n
 * \r\n
 *
 ******************************/

#include "mpHttpMethod.h"
#include "mpHttpResponseMessage.h"

namespace MP{
namespace HTTP{
namespace INTERNAL{

class HttpResponseTranslation
{
public:
    HttpResponseTranslation() = default;
    HttpResponseTranslation(const HttpResponseTranslation&) = delete;
    HttpResponseTranslation& operator=(const HttpResponseTranslation&) = delete;
    virtual ~HttpResponseTranslation() = default;

    void reset(HttpResponseMessage* httpResponseMessage,
               const std::string& http_method);
    bool parse(const char* data, std::size_t length);               //解析数据：如果返回真，则表示解析成功；如果返回假，则表示解析失败
    bool finished() const;
    bool is_parsed_http_header() const;
    std::size_t getContentLength() const;
    std::size_t getContentReadLength() const;
    bool checkContentReadIsComplete() const;

private:
    bool parseResponseHeader(const char* data, std::size_t length);
    bool parseResponseStatusLine(const std::string& line);
    bool parseResponseHeaderLine(const std::string& line);
    bool parseResponseContent(const char* data, std::size_t length);

    bool parseIdentityContent(const char* data, std::size_t length);
    bool parseChunkedContent(const char* data, std::size_t length);

    bool parseComplete();

    bool getNextLine(std::string& line,
                     std::size_t off);

    bool getNextChunkedSizeLine(std::string& line);
    bool parseChunkedSize(const std::string& line);
private:
    HttpResponseMessage* _httpResponseMessage;

    std::string _tmp_data = {};                                     //用于存储数据的临时变量
    bool _is_parsed_http_statu_line = false;                        //是否已完成Http Status Line解析
    bool _is_parsed_http_header = false;                            //是否已完成Http Header解析
    bool _is_parsed_finished = false;                               //是否已全部解析完成
    bool _is_has_content_length = false;                            //Http Header中是否包含Content-Length信息
    bool _is_chunked = false;                                       //数据是否以一系列分块的形式进行发送
    bool _is_chunked_complete = false;                              //数据分块发送完成
    bool _is_response_body_none = false;                            //是否Http响应中Body为空（当HttpMethod=Head的时候）
    std::size_t _next_block_chunk_size;                             //chunked情况下，下一数据块的大小
    std::size_t _header_content_length;                             //Http Header中标识的Content-Length值
    std::size_t _header_size;                                       //HTTP响应头部内容的大小（Http Status Line + Http Header）
    std::size_t _response_content_size;                             //HTTP Content内容的大小
};

}   //INTERNAL
}   //HTTP
}   //MP




#endif // MPHTTPRESPONSETRANSLATION_H
